//请求
const express=require('express')
const app=express()
//设置端口
const PORT=21111
//监听
app.listen(PORT,function(){
    console.log(`连接端口:${PORT}`);
})
//引入库
const Mongoose=require('mongoose')
Mongoose.connect('mongodb://127.0.0.1:27017/book', function() {
    console.log('数据库连接成功...')
})
//参数
const UserSchema = new Mongoose.Schema({
    id: String,
    name: String,
    sex: Number,
    birthday: Date,
    address: String,
    code: String,
    phone: String,
    email: String,
    level: Number
})
//映射    名字 策略 集合名
const UserModel =Mongoose.model('UserModel', UserSchema, 'book_info')
//get请求
app.get('/user/list',function(reg,res){
    //数据库集合find方法
    UserModel.find(function(err, docs){
        if (!!err) {
            console.log(err)
            res.send({code: 500, message: '执行查询错误'})
            // 出现错误，直接终止程序运行
            return
        }
        res.send({code: 200, data: docs, message: 'success'})
    }) 
    // UserModel.find(function(){

    // })
    // //(method) Model<any, {}, {}, {}>.find(callback?: Mongoose.Callback<any[]>): Mongoose.Query<any[], any, {}, any> (+2 overloads)
})
function loginHandler(req, res) {

    // console.log(req.headers)
    // body参数是如何从前端传递到后端来的？
    // query参数，是地址传递过来的，参数和请求地址一起发送出来的，所以可以直接获取
    // body参数，前端页面点击按钮以后请求地址和请求头先发送过来了，然后再是使用send方法传递数据给后端，
    // 并且要注意body参数传递使用的是数据流，所以它一定是一个异步的，所以应该是要去接收数据流
    // 那么express就应该要实现一个方法，这个方法可以把数据流转为一个js对象 -- 就应该使用一个把数据流转为json对象的中间件
    // console.log(req.body)
    let data = req.body

    // 使用数据模型请求数据库方法获取用户信息
    UserModel.findOne({id: data.id}, (err, doc) => {
        if (!!err) {
            res.send({code: 500, message: 'service error'})
        } else {
            if (!!doc) {
                let myPwd = MD5(doc.password).toString()
                if (data.password === myPwd) {
                    // 生成一个token数据
                    let token = AES.encrypt(doc.id + '&&' + Date.now(), 'test1234').toString()
                    tokenCache.push(token)

                    res.send({code: 200, message: 'success', data: {token, doc}})
                } else {
                    res.send({code: 400, message: '用户密码错误'})
                }
            } else {
                res.send({code: 400, message: '用户不存在'})
            }
        }
    })
}

function listHandler(req, res) {
    let query = req.query
    // 模糊查询
    UserModel.find({name: {$regex: query.name}}, function(err, docs) {
        if (!!err) {
            res.send({code: 500, message: 'service error'})
            return
        }

        res.send({code: 200, message: 'success', data: docs})
    })
}

/**
 * 删除用户的接口处理方法
 * @param {*} req 
 * @param {*} res 
 */
function deleteHandler(req, res) {
    let body = req.body
    // 删除方法的形参应该有几个？因为删除，只需要知道执行是否成功就行了
    UserModel.deleteOne({id: body.id}, function(err) {
        if (!!err) {
            res.send({code: 500, message: 'service error'})
            return
        }

        res.send({code: 200, message: 'success'})
    })
}

function saveHandler(req, res) {
    let data = req.body
    // 需要先对实例进行new运算
    // new UserModel(data).save(err => {
    let userObj = new UserModel(data)
    userObj.save(err => {
        if (!!err) {
            res.send({code: 500, message: 'service error'})
            return
        }

        res.send({code: 200, message: 'success'})
    })
}

module.exports = {
    loginHandler,
    listHandler,
    deleteHandler,
    saveHandler
}